<?php

/**
 * Функция генерирует url по указанным параметрам. Конечный URL также зависит от усановленного режима
 * ЧПУ (при включённом режиме будут генерироваться ЧПУ ссылки)
 * 
 * @param string $controller Имя контроллера. По умолчанию index.
 * @param string method Название вызываемого метода. По умолчанию home.
 * @param array @parameters Массив (формата "ключ=>значение") содержащий параметры
 * @return string Сформированный URL
 */
function url($controller = 'index', $method = 'home', array $parameters = null) {
    // Начальная часть URL'а
    $startPart = SITE . '/';
    // Если режим ЧПУ-ссылок выключен
    if (SEF === false) {
        $result  = $startPart . '?c=' . $controller;
        $result .= '&m=' . $method;
    // Если режим ЧПУ-ссылок включен
    } else {
        $result = sprintf("%s%s/%s", $startPart, $controller, $method);
    }
    
    // Генерируем параметры запроса
    if ((! is_null($parameters)) && is_array($parameters)) {
        foreach ($parameters as $key => $value) {
            $result .= sprintf('&%s=%s', (string)$key, (string)$value);
        }
    }
    // Возвращаем сформированный URL
    return $result;
}


/**
 * Функция выполняет внутрисайтовый редирект
 * Например вызов quickRedirect('/?c=abc&m=def') переадресует на http://site.com/?c=abc&m=def
 *
 * @param string $query Часть запроса после адреса сайта
 * @return void
 */
function quickRedirect($query) {
    header('Location: ' . SITE . $query);
}


/**
 * Функция перенаправляет на url по указанным параметрам. Конечный URL также зависит от усановленного режима
 * ЧПУ (при включённом режиме будут произовадится редирект по ЧПУ-адресу)
 *
 * @param string $controller Имя контроллера. По умолчанию index.
 * @param string method Название вызываемого метода. По умолчанию home.
 * @param array @parameters Массив (формата "ключ=>значение") содержащий параметры
 * @return void
 */
function redirect($controller = 'index', $method = 'home', array $parameters = null) {
    header('Location: ' . url($controller, $method, $parameters));
}


/**
 * Функция генерирует серверную ошибку и отображает соотвествующую страницу
 *
 * @param int $code Код серверной ошибки. По умолчанию 404 ("не найдено")
 * @param bool $exit Если данный параметр установлен как TRUE, то после отправки заголовков ошибок и вывода станицы,
 *   работа скрипта автоматически прекратится. По умолчанию TRUE.
 * @return void
 */
function error($code = 404, $exit = true) {

    $protocol = 'HTTP/1.1';

    $messages = array(
        403 => '403 Forbidden', // 403: Доступ запрещён
        404 => '404 Not Found', // 404: Страница не найдена
    );

    // Посылаем ответ
    $header = sprintf('%s %s', $protocol, $messages[$code]);
    header($header);
    
    // Подгрузка соотвествующей страницы
    require_once VIEWS . DS . 'errors' . DS . (string)$code . '.php';
    // Если всключеён режим $exit, завершаем работу скрипта
    if ($exit === true) exit();
}


/**
 * Функция возвращает полный путь к выполняемой странице (возвращает текущий URL)
 *
 * @return string Текущий URL
 */
function path() {
    return SITE . '/' . $_SERVER['QUERY_STRING'];
}


function between($number, $min, $max, $strict = true) {
    if ($strict === true) {
        return (($min < $number) && ($max > $number));
    } else {
        return (($min <= $number) && ($max >= $number));
    }
}


function clampNumber($number, $mix, $max) {
    if ((int)$number < (int)$min) {
        $result = $min;
    } elseif ((int)$number > (int)$max) {
        $result = $max;
    } else {
        $result = $number;
    }
    return (int)$result;
}


function setTimeZone($timeZone) {
    date_default_timezone_set($timeZone);
}


function loadSystemFiles($names) {
    for ($i = 0; $i < func_num_args(); $i++) {
        $name = func_get_arg($i);
        require_once ROOT . DS . 'system' . DS . $name . '.php';
    }
}